package jp.syuriken.snsw.terenaibot;

import jp.syuriken.snsw.terenaibot.plugins.RegisterablePlugin;

/**
 * プラグインコンテナ。
 * 
 * @author $Author: snswinhaiku.lo@gmail.com $
 * @version 0.2
 */
public interface PluginContainer {
	
	/**
	 * プラグインを追加する。
	 * 
	 * @param plugin プラグイン
	 */
	void addPlugin(RegisterablePlugin plugin);
	
	/**
	* プラグインの初期化を行う。
	* 
	* <p>これは必ずすべてのフックの呼び出し前に呼び出す必要があります。
	* 呼び出さない場合の他のすべての関数の呼び出し時の動作は保証されません</p>
	* @param configuration 設定
	*/
	void constructPlugins(BotConfiguration configuration);
	
	/**
	 * プラグインの破棄を行う。
	 */
	void destructPlugins();
	
	/**
	 * API呼び出し規制がかかりました。
	 */
	void exceedApiLimitation();
	
	/**
	 * ポスト規制がかかりました。
	 */
	void exceedPostLimitation();
	
	/**
	 * フォローしたあとのフック
	 * 
	 * @param userInfo ユーザー情報
	 */
	void hookAfterFollow(UserInfo userInfo);
	
	/**
	 * ポスト後のフック。
	 * 
	 * @param post ポストデータ
	 */
	void hookAfterPost(Post post);
	
	/**
	 * プライベートメッセージを送信したあとのフック。
	 * 
	 * @param privateMessage プライベートメッセージ
	 */
	void hookAfterSendPrivateMessage(Post2 privateMessage);
	
	/**
	 * アンフォローしたあとのフック
	 * 
	 * @param userInfo ユーザー情報
	 */
	void hookAfterUnfollow(UserInfo userInfo);
	
	/**
	 * フォローする前のフック。falseを返した場合、フォローを中止して下さい。
	 * 
	 * @param userId ユーザーID
	 * @return フォローを続行するかどうか。
	 */
	boolean hookBeforeFollow(String userId);
	
	/**
	 * ポスト前のフック。
	 * 
	 * @param postString ポストする前の文字列
	 * @return ポストを続行するかどうか
	 */
	boolean hookBeforePost(String postString);
	
	/**
	 * プライベートメッセージを送信する前のフック。falseを返した場合、送信を中止して下さい。
	 * @param poststr メッセージ
	 * @param targetId 送信先のID
	 * @return フォローを続行するかどうか。
	 */
	boolean hookBeforeSendPrivateMessage(String poststr, String targetId);
	
	/**
	 * アンフォローする前のフック。falseを返した場合、フォローを中止して下さい。
	 * 
	 * @param userId ユーザーID
	 * @return フォローを続行するかどうか。
	 */
	boolean hookBeforeUnfollow(String userId);
	
	/**
	 * プライベートメッセージを受信しました。
	 * 
	 * @param privateMessages プライベートメッセージ
	 */
	void hookGotPrivateMessage(Post2[] privateMessages);
	
	/**
	 * タイムラインを受信しました。
	 * 
	 * @param posts タイムライン (Mention含む)
	 */
	void hookGotTimeline(Post2[] posts);
	
	/**
	 * 新しいフォロワーが出現しました
	 * 
	 * @param newFollowers ユーザー情報
	 */
	void hookNewFollower(UserInfo[] newFollowers);
	
	/**
	 * 新しいアンフォロワーが出現しました。
	 * 
	 * @param newUnfollowers ユーザー情報
	 */
	void hookNewUnfollower(UserInfo[] newUnfollowers);
	
	/**
	 * API制限が解除されました。
	 * 
	 */
	void resetExceededApiLimitation();
	
	/**
	 * ポスト制限が解除されました。
	 * 
	 */
	void resetExceededPostLimitation();
	
}
